//
// Description: 837. 连通块中点的数量
// Created by Loading on 2021/12/26.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 100010;

int father[N]; // 存储每个节点的父节点
int cnt[N];    // 存储每个节点所在连通块节点数量

// 查找 x 的祖先节点 + 路径压缩
int find(int x) {
    if (father[x] != x) {
        father[x] = find(father[x]);
    }
    return father[x];
}

int main() {
    int n, m;
    cin >> n >> m;
    // 初始化
    for (int i = 1; i <= n; ++i) {
        father[i] = i;
        cnt[i] = 1;
    }
    while (m--) {
        string op;
        cin >> op;

        if (op == "C") {
            int a, b;
            cin >> a >> b;
            /* 两个点已经在一个连通块中，无需操作 */
            if (find(a) == find(b)) {
                continue;
            }
            // 更新节点数量
            cnt[find(b)] += cnt[find(a)];
            father[find(a)] = find(b);
        } else if (op == "Q1") {
            int a, b;
            cin >> a >> b;
            if (find(a) == find(b)) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        } else if (op == "Q2") {
            int a;
            cin >> a;
            /* 要使用 cnt[a的祖先节点]，而不是 cnt[a] */
            cout << cnt[find(a)] << endl;
        }
    }

    return 0;
}